/**
 * 
 */
package com.ms.service.module.zone.command;

import com.ms.player.Player;
import com.ms.service.module.zone.BasicZone;
import com.ms.service.module.zone.module.BasicZoneModule;
import com.xpec.c4.game.time.TimeSys;
import com.xpec.c4.game.utility.GUID;
import com.xpec.c4.game.utility.GameUtility;
import com.xpec.c4.message.MessageTypes;
import com.xpec.c4.service.contexts.Contexts;
import com.xpec.c4.service.message.MessageAction;
import com.xpec.c4.service.module.BasicServiceModule;

/**
 * debug 指令基礎類別
 * 
 * @author lipeilin
 * @2011-3-27 下午02:56:12
 *
 */
public abstract class BasicDebugCommand {
	
	/** 指令觸發的時候可以直接使用的玩家資料 */
	protected Player player;
	
	/**
	 * 包含後面參數的完整命令字串<br>
	 * 例：test a b c
	 */
	protected String command;
	
	/**
	 * 將完整命令字串分割成命令和參數的陣列<br>
	 * 例：[0]=test [1]=a [2]=b [3]=c
	 */
	protected String[] commandValue;
	
	/**
	 * 是否可执行检查<br>
	 * 有特別需求某些條件下不可執行的指令可以改寫這個。
	 * 
	 * @return true 可以執行<br>
	 *         false 不可以執行
	 * @author lipeilin
	 * @2011-3-27 下午02:57:32
	 */
	public boolean available(){
		return true;
	}
	
	/**
	 * 执行
	 * 
	 * @return 返回给client的信息
	 *
	 * @author lipeilin
	 * @2011-3-27 下午02:57:40
	 */
	public abstract String execute();
	
	/**
	 * 唯一ID
	 * 
	 * @return
	 *
	 * @author lipeilin
	 * @2011-3-27 下午03:03:51
	 */
	public abstract String getName();
	
	/**
	 * 描述
	 * 
	 * @return
	 *
	 * @author lipeilin
	 * @2011-3-27 下午03:03:51
	 */
	public abstract String getDescription();

	/**
	 * 簡短描述，用一行文字顯示指令說明，顯示指令列表時用
	 * 
	 * @return
	 *
	 * @author lipeilin
	 * @2011-3-27 下午03:03:51
	 */
	public abstract String getShortDescription();

	/**
	 * 取得指定位置的參數
	 * 
	 * @param index
	 *            參數索引值<br>
	 *            commandValue[0]: command<br>
	 *            commandValue[1]: param 1<br>
	 *            commandValue[2]: param 2<br>
	 *            .......<br>
	 *            commandValue[n]: param n
	 * @return
	 */
	public String getParam(int index) {
		String res = null;

		if (index < commandValue.length) {
			res = commandValue[index];
		}

		return res;
	}

	/**
	 * 將輸入的參數轉成 int 取出
	 * 
	 * @param index
	 *            參數索引, see {@link #getParam(int)}.
	 * @return int value
	 */
	public int getParamToInt(int index) {
		String numStr = getParam(index);

		if (!GameUtility.isNumeric(numStr)) {
			return 0;
		}

		return Integer.valueOf(numStr);
	}

	/**
	 * 將輸入的參數轉成 long 取出
	 * 
	 * @param index
	 *            參數索引, see {@link #getParam(int)}.
	 * @return long value
	 */
	public long getParamToLong(int index) {
		String numStr = getParam(index);

		if (!GameUtility.isNumeric(numStr)) {
			return 0;
		}

		return Long.valueOf(numStr);
	}

	/**
	 * 觸發指令時，取得接收到指令的 module
	 * 
	 * @return module instance
	 */
	public BasicZoneModule getModule() {
		BasicServiceModule basicServiceModule = Contexts.getModule();
		if (basicServiceModule instanceof BasicZoneModule) {
			BasicZoneModule basicZoneModule = (BasicZoneModule) basicServiceModule;
			return basicZoneModule;
		}

		return null;
	}

	/**
	 * 觸發指令時，取得接收到指令的 zone
	 * 
	 * @return zone instance
	 */
	public BasicZone getZone() {
		BasicZoneModule basicZoneModule = getModule();
		if (basicZoneModule != null) {
			BasicZone basicZone = basicZoneModule.getZone();
			return basicZone;
		}

		return null;
	}
	
	/**
	 * 回應執行 debug 指令的結果
	 * 
	 * @param sessionId
	 *            client session id
	 * @param response
	 *            回應字串
	 */
	public static void sendDebugCommandResponse(GUID sessionId, String response) {
		String timeStr = GameUtility.timeToString(TimeSys.currentTimeMills(), "[" + GameUtility.TIME_FORMAT_TIME_MS
				+ "] ");
		MessageAction.sendMessage(sessionId, MessageTypes.S_ZONE_DEBUG_COMMAND_RESPONSE, timeStr + response);
	}

	public Player getPlayer() {
		return player;
	}

	public void setPlayer(Player player) {
		this.player = player;
	}

	public String getCommand() {
		return command;
	}

	public void setCommand(String command) {
		this.command = command;
	}

	public String[] getCommandValue() {
		return commandValue;
	}

	public void setCommandValue(String[] commandValue) {
		this.commandValue = commandValue;
	}
}
